package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.thoughtworks.xstream.XStream;

import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOLetraDeCambio;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.entidad.Letra;
import pe.com.cotelasa.seguridad.common.util.Constantes.EstadoRegistro;

@Repository("daoLetraDeCambioImpl")
public class DAOLetraDeCambioImpl extends DaoImpl<Letra, Integer> implements IDAOLetraDeCambio, Serializable {
	
	private static final long serialVersionUID = 1L;
	
	@Autowired
    private SessionFactory sessionFactory;
	
	@Override
    @Transactional(readOnly=true)
    public Letra obtenerLetraPorNumero(String numeroLetra) throws DAOException {
    	Letra letraBuscada = null;
        try {
            letraBuscada = (Letra) sessionFactory.getCurrentSession().createCriteria(Letra.class)
                    .add(Restrictions.eq("numeroFactura", numeroLetra))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO)).uniqueResult();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return letraBuscada;
    }
	
	
	@Override
	public List<Letra> obtenerBusquedaLetrasPorFiltros(Letra letra)
			throws DAOException {
		List<Letra> listaLetra = new ArrayList<Letra>();
		try {
			Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Letra.class);
			if(letra.getProveedor().getId()!=null && letra.getProveedor().getId()!=0){
				criteria.add(Restrictions.eq("proveedor.id",letra.getProveedor().getId()));
			}
			if(letra.getTipoMoneda().getId()!=null && letra.getTipoMoneda().getId()!=0){
				criteria.add(Restrictions.eq("tipoMoneda.id",letra.getTipoMoneda().getId()));
			}	
			if(!letra.getEstadoLetra().equalsIgnoreCase("T")){
				criteria.add(Restrictions.eq("estadoLetra",letra.getEstadoLetra()));
			}
			criteria.add(Restrictions.eq("estadoRegistro",EstadoRegistro.ESTADO_REGISTRO_ACTIVO));
			listaLetra = criteria.list();
		} catch (Exception e) {
			throw new DAOException(e.getMessage(), e);
		}
		return listaLetra;
	}
	
}